﻿#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康
#include<stdio.h>
//int main() 
//{
//	//编译和汇编
//	//翻译环境和执行环境
//	//.c  --> 编译  --->  .obj  （windows）
//	//翻译环境：编译和链接：把代码翻译成二进制代码
//
//	printf("hello world\n");
//	return 0;
//}

//IDE集成开发环境
//Linux 环境下编译器gcc
//

//预处理（文本操作） --->  .i文件
//1、头文件的包含  --递归方式展开
//预处理指令
//2、#define的替换
//3、注释的删除
//添加行号和文件的标识符

//编译：代码翻译成汇编代码
//生成.s文件
//词法分析、语法分析、语义分析

//汇编：把汇编代码生成二进制的指令
//生成.o文件

//链接：把一堆文件生成一个可执行的程序
//链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
//解决一个项目中文件和模块之间的调用问题

#include <stdio.h>
//test.c
//声明外部函数
extern int Add(int x, int y);
//声明外部的全局变量
extern int g_val;
//int main() 
//{
//	int a = 10;
//	int b = 20;
//	int sum = Add(a, b);
//	printf("%d\n", sum);
//	return 0;
//}
//符号汇总

//预处理详解
//__FILE__ //进⾏编译的源⽂件
//__LINE__ //⽂件当前的⾏号
//__DATE__ //⽂件被编译的⽇期
//__TIME__ //⽂件被编译的时间
//__STDC__ //如果编译器遵循ANSI C，其值为1，否则未定义

extern void test();
//int main() 
//{
//	test();
//	printf("");
//	return 0;
//}

//#define定义宏
//#define name( parament-list ) stuff
//参数列表的左括号必须与name紧邻，如果两者之间有任何空⽩存在，\
参数列表就会被解释为stuff的⼀部分。

#define SQUARE(X) X*X
//宏的参数不运算，直接计算
//1,宏的参数中如果有操作符，和宏的内容中的操作符
//

#define DOUBLE(X) (2*X)
//int main()
//{
//	int a = 3;
//	printf("%d\n",DOUBLE(a));
//	return 0;
//
//}

//带有副作用的宏定义

//宏不支持递归

//宏函数的对比
//1. ⽤于调⽤函数和从函数返回的代码可能⽐实际执⾏这个⼩型\
计算⼯作所需要的时间更多。所以宏⽐\
函数在程序的规模和速度⽅⾯更胜⼀筹。
//2. 更为重要的是函数的参数必须声明为特定的类型。所以函数只\
能在类型合适的表达式上使⽤。反之\
这个宏怎可以适⽤于整形、⻓整型、浮点型等可以⽤于 > 来⽐较的\
类型。宏是类型⽆关的。

#define MALLOC(n,type) (type*)malloc(n*sizeof(type))

//宏定义
#define GENERIC_MAX(type) \
type type##_max(type x, type y)\
{ \
 return (x>y?x:y); \
}

GENERIC_MAX(int) //替换到宏体内后int##_max ⽣成了新的符号 int_max做函数名
GENERIC_MAX(float) //替换到宏体内后float##_max ⽣成了新的符号 float_max做函数名

//int main()
//{
//	//调⽤函数
//	int m = int_max(2, 3);
//	printf("%d\n", m);
//	float fm = float_max(3.5f, 4.5f);
//	printf("%f\n", fm);
//	return 0;
//}

//命名约定\
宏一般都大写\
函数一般都大写

//undefine移除宏

#define MAXC 100
//int main() 
//{
//	printf("%d\n",MAXC);
//#undef MAXC
//
//	return 0;
//}

//命名定义行
//int main()
//{
//	int array[ARRAY_SIZE];
//	int i = 0;
//	for (i = 0; i < ARRAY_SIZE; i++)
//	{
//		array[i] = i;
//	}
//	for (i = 0; i < ARRAY_SIZE; i++)
//	{
//		printf("%d ", array[i]);
//	}
//	printf("\n");
//	return 0;
//}

//条件编译

#define __DEBUG__
int main()
{
	int i = 0;
	int arr[10] = { 0 };
	for (i = 0; i < 10; i++)
	{
		arr[i] = i;
#ifdef __DEBUG__
		printf("%d\n", arr[i]);//为了观察数组是否赋值成功。 
#endif //__DEBUG__
	}
	return 0;
}
//条件编译指令
//头文件包含
//宏定义

//头文件的包含
//#include<> 标准库的\
查找直接查找标准库的

//include""本地创建的
//查找先找源文件下的目录，然后标准库查找\
如果找不到就是报错了

// #pragma once包含一次
